---
title: Future
---
利用 Java 并发包提供的 Future 可以很容易获得异步任务的执行结果，无论异步任务是通过线程池 ThreadPoolExecutor 执行的，还是通过手动创建子线程来执行的。

利用多线程可以快速将一些并行的任务串行化，从而提高性能；如果任务之间有依赖关系，比如当前任务依赖前一个任务的执行结果，这种问题基本上都可以用 Future 来解决。


## 获取任务执行结果
ThreadPoolExecutor 的 void execute(Runnable command) 方法可以提交任务，但是却没有办法获取任务的执行结果。

而很多场景下，是需要获取任务的执行结果的。

Java 通过 ThreadPoolExecutor 提供的 3 个 submit() 方法和 1 个 FutureTask 工具类来支持获取任务执行结果的需求。
```java title='三个 submit() 方法的方法签名如下：'
//提交 Runnable 任务，返回值仅用于断言任务已经结束了，类似 Thread.join()
Future<?> submit(Runnable task);
//提交 Callable 任务
<T> Future<T> submit(Callable<T> task);
//提交Runnable 任务及结果引用
<T> Future<T> submit(Runnable task,T result);
```
它们的返回值都是 Future 接口，Future 接口有 5 个方法。

```java title='Future 接口的 5 个方法'
//取消任务
boolean cannel(boolean mayInterruptIfRunning);
//判断任务是否取消
boolean isCanceled();
//判断任务是否结束
boolean isDone();
//获得任务执行结果
get();
//获得任务执行结果，支持超时。
```

Future是一个接口，而 FutureTask 是一个工具类，这个工具类有两个构造函数，它们的参数和前面介绍的 submit() 方法类似。
```java
FutureTask(Callabel<T> callable);
FutureTask(Runnable runnable,V result);
```
FutureTask 实现了 Runnable 和 Future 接口，由于实现了 Runnable 接口，所以可以将 FutureTask 对象作为任务提交给 ThreadPoolExecutor 去执行，也可以直接被 Thread 执行；又因为实现了 Future 接口，所以也能用来获取任务的执行结果。

```java title='将 FutureTask 提交给 ThreadPoolExecutor 去执行'
//创建 FutureTask
FutureTask<Integer> futureTask = new FutureTask<>(() -> 1 + 2);
//创建线程池
ExecutorService executorService = Executors.newSingleThreadExecutor();
//提交 FutureTask
executorService.submit(futureTask);
//获取计算结果
Integer integer = futureTask.get();
System.out.println("integer = " + integer);
```


```java title='使用 FutureTask 对象可以很容易获取子线程的执行结果'
//创建 FutureTask
FutureTask<Integer> futureTask = new FutureTask<>(() -> 1 + 2);
//创建并启动线程
Thread thread = new Thread(futureTask);
thread.start();
//获取计算结果
Integer integer = futureTask.get();
System.out.println("integer = " + integer);
```
